//
// Created on 2023/5/29.
//
// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
// please include "napi/native_api.h".

#ifndef NapiDemo_avcodec_log_H
#define NapiDemo_avcodec_log_H

#define LOG_TAG_PRC "YW_Encoder"
#define IS_DEBUG 1

#if __ANDROID__

#include <android/log.h>

#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG_PRC, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG_PRC, __VA_ARGS__)

#if IS_DEBUG

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG_PRC, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG_PRC, __VA_ARGS__)
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG_PRC, __VA_ARGS__)

#else

#define LOGI(...)
#define LOGD(...)
#define LOGV(...)

#endif

#elif __APPLE__

#include <stdio.h>

#define LOGW(fmt, ...) printf("W/%s: ",LOG_TAG_PRC);printf((fmt), ##__VA_ARGS__);printf("\n");
#define LOGE(fmt, ...) printf("E/%s: ",LOG_TAG_PRC);printf((fmt), ##__VA_ARGS__);printf("\n");

#if IS_DEBUG

#define LOGI(fmt, ...) printf("I/%s: ",LOG_TAG_PRC);printf((fmt), ##__VA_ARGS__);printf("\n");
#define LOGD(fmt, ...) printf("D/%s: ",LOG_TAG_PRC);printf((fmt), ##__VA_ARGS__);printf("\n");
#define LOGV(fmt, ...) printf("V/%s: ",LOG_TAG_PRC);printf((fmt), ##__VA_ARGS__);printf("\n");

#else

#define LOGI(fmt, ...)
#define LOGD(fmt, ...)
#define LOGV(fmt, ...)

#endif

#elif __OHOS__



#include <hilog/log.h>
#define LOG_DOMAIN_PRC 0x55AA

#define AVCODEC_LOGW(...) ((void)OH_LOG_Print(LOG_APP, LOG_WARN, LOG_DOMAIN_PRC, LOG_TAG_PRC, __VA_ARGS__))
#define AVCODEC_LOGE(...) ((void)OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_DOMAIN_PRC, LOG_TAG_PRC, __VA_ARGS__))

#if IS_DEBUG

#define AVCODEC_LOGI(...) ((void)OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN_PRC, LOG_TAG_PRC, __VA_ARGS__))
#define AVCODEC_LOGD(...) ((void)OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_DOMAIN_PRC, LOG_TAG_PRC, __VA_ARGS__))
#define AVCODEC_LOGV(...) ((void)OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_DOMAIN_PRC, LOG_TAG_PRC, __VA_ARGS__))

#define CHECK_AND_RETURN_RET_LOG(cond, ret, fmt, ...)   \
    do {                                                \
        if (!(cond)) {                                  \
            AVCODEC_LOGE(fmt, ##__VA_ARGS__);           \
            return ret;                                 \
        }                                               \
    } while (0)

#define DEMO_CHECK_AND_RETURN_LOG(cond, fmt, ...)               \
    do {                                                        \
        if (!(cond)) {                                          \
            (void)AVCODEC_LOGE(fmt, ##__VA_ARGS__);             \
            return;                                             \
        }                                                       \
    } while (0)

#define DEMO_CHECK_AND_RETURN_RET_LOG(cond, ret, fmt, ...)      \
    do {                                                        \
        if (!(cond)) {                                          \
            (void)AVCODEC_LOGE(fmt, ##__VA_ARGS__);             \
            return ret;                                         \
        }                                                       \
    } while (0)
#else

#define LOGI(...)
#define LOGD(...)
#define LOGV(...)

#endif

#endif


#endif //NapiDemo_avcodec_log_H
